package proceso.carga.precipitacion;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.StringTokenizer;

import pluviometria.Estacion;
import pluviometria.Lectura;
import pluviometria.MedicionAnual;

/**
 * 
 * @author edgar
 * carga del historico de precipitacion anual para todas las estaciones
 */
public class CargaPrecipitacion {

	private String razon;
	private List<Estacion> listaEstacion = new ArrayList<Estacion>();
	public String getRazon() {
		return razon;
	}
	public void setRazon(String razon) {
		this.razon = razon;
	}
	public List<Estacion> getListaEstacion() {
		return listaEstacion;
	}
	public void setListaEstacion(List<Estacion> listaEstacion) {
		this.listaEstacion = listaEstacion;
	}
	
	public boolean cargar(String archivo){
		String linea;
		StringTokenizer tokens;
		StringTokenizer campos, fecha;
		String aux, aux2;
		int posAst;
		Calendar fechaAsignada;
		
		File arch = new File(archivo);
		try {
			FileReader lectorArchivo = new FileReader(arch);
			BufferedReader lectorBuffer = new BufferedReader(lectorArchivo);
			while(lectorBuffer.ready()){
				linea = lectorBuffer.readLine();
				tokens = new StringTokenizer(linea);
				aux = tokens.nextToken();
				campos = new StringTokenizer(aux, ":");
				if(!campos.nextToken().contentEquals("ESTACION")){
					razon = "Se espera la palabra ESTACION: en la linea " + linea;
					return false;
				}
				Estacion estacion = new Estacion();
				estacion.inicializarHistorico();
				estacion.setNombre(campos.nextToken());
				
				campos = new StringTokenizer(tokens.nextToken(),":");
				aux = campos.nextToken();
				estacion.setTipo(campos.nextToken());

				campos = new StringTokenizer(tokens.nextToken(),":");
				aux = campos.nextToken();
				estacion.setSerial(campos.nextToken());

				campos = new StringTokenizer(tokens.nextToken(),":");
				if(campos.countTokens()==2){
					aux = campos.nextToken();
					estacion.setZona(campos.nextToken());
				}
				
				campos = new StringTokenizer(tokens.nextToken(),":");
				aux = campos.nextToken();
				estacion.setUbicacion(campos.nextToken());

				if(campos.countTokens()==2){
					campos = new StringTokenizer(tokens.nextToken(),":");
					aux = campos.nextToken();
					estacion.setLatitud(Double.parseDouble(campos.nextToken()));
				}
				
				if(campos.countTokens()==2){
					campos = new StringTokenizer(tokens.nextToken(),":");
					aux = campos.nextToken();
					estacion.setLongitud(Double.parseDouble(campos.nextToken()));
				}

				if(campos.countTokens()==2){
					campos = new StringTokenizer(tokens.nextToken(),":");
					aux = campos.nextToken();
					estacion.setAltitud(Double.parseDouble(campos.nextToken()));
				}
				
				if(campos.countTokens()==2){
					campos = new StringTokenizer(tokens.nextToken(),":");
					aux = campos.nextToken();
					estacion.setOrg(campos.nextToken());
				}

				if(campos.countTokens()==2){
					campos = new StringTokenizer(tokens.nextToken(),":");
					aux = campos.nextToken();
					fecha = new StringTokenizer(aux, "/");
					aux = fecha.nextToken();
					aux2 = fecha.nextToken();
					fechaAsignada = Calendar.getInstance();
					fechaAsignada.set(Integer.parseInt(aux2),Integer.parseInt(aux),1);
					estacion.setFechaInstalacion(fechaAsignada);
				}

				if(campos.countTokens()==2){
					campos = new StringTokenizer(tokens.nextToken(),":");
					aux = campos.nextToken();
					fecha = new StringTokenizer(aux, "/");
					aux = fecha.nextToken();
					aux2 = fecha.nextToken();
					fechaAsignada = Calendar.getInstance();
					fechaAsignada.set(Integer.parseInt(aux2),Integer.parseInt(aux),1);
					estacion.setFechaEliminacion(fechaAsignada);
				}

				int cont = 0;
				boolean cond = true;
				do {
					linea = lectorBuffer.readLine();
					tokens = new StringTokenizer(linea);
					aux = tokens.nextToken();
					if(aux.contentEquals("PROM:")){
						cond = false;
					}
					else{
						MedicionAnual medicion = new MedicionAnual();
						medicion.setA_o(Integer.parseInt(aux));
						medicion.inicializarListaLectura();
						for(int i=0; i<12; i++){
							aux = tokens.nextToken();
							Lectura lectura = new Lectura();
							posAst = aux.indexOf("*");
							if(posAst>=0) {
								lectura.setAcumulado(true);
								if(aux.length() == 1){
									aux ="";
									lectura.setValorNulo(true);
								}else {
									aux = aux.substring(0, posAst);
								}
							}
							else {
								lectura.setAcumulado(false);
							}
							if(aux.indexOf("-") < 0){
								if(aux.length() >0) {
									lectura.setValor(Float.parseFloat(aux));
									lectura.setValorNulo(false);
								}
								else {
									lectura.setValorNulo(true);
								}
							}
							else{
								lectura.setValorNulo(true);
							}
							lectura.setMedicion(medicion);
							medicion.agregarLLectura(lectura);
						}
						estacion.agregarMedicion(medicion);
						medicion.setEstacion(estacion);
					}

				}while(cond);
				listaEstacion.add(estacion);
				linea = lectorBuffer.readLine();
				linea = lectorBuffer.readLine();
				linea = lectorBuffer.readLine();

			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			razon = "Archivo no encontrado";
			e.printStackTrace();
			return false;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			razon = "Error de lectura";
			return false;
		}
		return true;
	}
	
}
